package com.app.sgd.business.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.app.sgd.model.bean.ClasificacionDocumentos;
import com.app.sgd.model.bean.TipoDocumento;
import com.app.sgd.plugin.JNDIConnector;

public class SQLMantenimientoDAO {
private static Logger logger = Logger.getLogger(SQLMantenimientoDAO.class);
	
	DataSource ds = null;
	JNDIConnector cn = new JNDIConnector();
	
	public ArrayList listarClasificacionDocumentos() throws Exception {
		ArrayList lstClasificacionDocumentos = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_get_clasificacion_docs()}";
	    	call = conn.prepareCall(vSQL);
            logger.info("inicio:" + new Date());
            rs = call.executeQuery();
            logger.info("fin: " + new Date());
            int ind=0;
            while(rs.next()){
            	ClasificacionDocumentos clasificacionDocumentos = new ClasificacionDocumentos();
            	clasificacionDocumentos.setIndiceClasif(String.valueOf(ind++));
            	clasificacionDocumentos.setCodClasif(rs.getString("fCODI_CLASIF_CLA"));
            	clasificacionDocumentos.setDescClasif(rs.getString("vDESC_CLASIF_CLA"));
            	clasificacionDocumentos.setEstadoClasif(rs.getString("cEST_CLASIF_CLA"));
            	clasificacionDocumentos.setDescEstadoClasif(rs.getString("vDESC_ESTA_CLASIF_CLA"));
            	clasificacionDocumentos.setOrdenClasif(rs.getString("nORD_CLASIF_CLA"));
            	clasificacionDocumentos.setCodPlazo(rs.getString("fCODI_PLZ_TPLZ"));
            	clasificacionDocumentos.setDiasPlazo(rs.getString("nDIAS_PLAZO_CLA"));
            	clasificacionDocumentos.setDescPlazo(rs.getString("DESC_PLZ_TPLZ"));
            	
            	lstClasificacionDocumentos.add(clasificacionDocumentos);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en listarClasificacionDocumentos: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstClasificacionDocumentos;
	}
	
	public int[] anularClasificacionDocumentos(ArrayList lstClasificacionDocumentos) throws Exception{
		int res[] = new int[lstClasificacionDocumentos.size()];
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
			String vSQL = "{call std_sp_elim_clasificacion_docs(?)}";
			int ind=0;
	    	for(Iterator it=lstClasificacionDocumentos.iterator(); it.hasNext();){
	    		ClasificacionDocumentos clasificacionDocumentos = (ClasificacionDocumentos)it.next();
	    		call = conn.prepareCall(vSQL);
	    		call.setInt(1,Integer.parseInt(clasificacionDocumentos.getCodClasif()));
	            logger.info("inicio:" + new Date());
	            res[ind] = call.executeUpdate();
	            logger.info("fin: " + new Date());
	    	}
		}catch(Exception e){
			logger.error("[STD]: Error en anularClasificacionDocumentos: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return res;
	}
	
	public int actualizarClasificacionDocumentos(ClasificacionDocumentos clasificacionDocumentos) throws Exception{
		int res = 0;
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
			String vSQL = "{call std_sp_upd_clasificacion_docs(?,?,?,?,?,?)}";

			call = conn.prepareCall(vSQL);
    		call.setInt(1,Integer.parseInt(clasificacionDocumentos.getCodClasif()));
    		call.setString(2,clasificacionDocumentos.getDescClasif().toUpperCase());
    		call.setString(3,clasificacionDocumentos.getEstadoClasif());
    		call.setInt(4,Integer.parseInt(clasificacionDocumentos.getOrdenClasif()));
    		call.setInt(5,Integer.parseInt(clasificacionDocumentos.getCodPlazo()));
    		call.setInt(6,Integer.parseInt(clasificacionDocumentos.getDiasPlazo()));
	    	
            logger.info("inicio:" + new Date());
            res = call.executeUpdate();
            logger.info("fin: " + new Date());
		}catch(Exception e){
			logger.error("[STD]: Error en actualizarClasificacionDocumentos: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return res;
	}

	public ArrayList listadoTiposDocumentos() throws Exception {
		ArrayList lstTiposDocumentos = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
	    	String vSQL = "{call std_sp_get_tipo_docs_mov()}";
	    	call = conn.prepareCall(vSQL);
            logger.info("inicio:" + new Date());
            rs = call.executeQuery();
            logger.info("fin: " + new Date());
            int ind=0;
            while(rs.next()){
            	TipoDocumento tipoDocumentoMovimiento = new TipoDocumento();
            	tipoDocumentoMovimiento.setIndiceTipoMovimiento(String.valueOf(ind++));
            	tipoDocumentoMovimiento.setCodTipoMovimiento(rs.getString("CODI_TMOV_TTM"));
            	tipoDocumentoMovimiento.setDescTipoMovimiento(rs.getString("DESC_TMOV_TTM"));
            	tipoDocumentoMovimiento.setCodTipoDocumento(rs.getString("CODI_TDOC_TTD"));
            	tipoDocumentoMovimiento.setDescTipoDocumento(rs.getString("DESC_TDOC_TTD"));
            	tipoDocumentoMovimiento.setBytesPlantilla(rs.getBytes("DOC_IMA_TTD"));
            	tipoDocumentoMovimiento.setNombrePlantilla(rs.getString("NAME_DOC_TTD"));
            	lstTiposDocumentos.add(tipoDocumentoMovimiento);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en listadoTiposDocumentos: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstTiposDocumentos;
	}
	
	
	public int actualizarTiposDocumentoMovimiento(TipoDocumento tipoDocumento) throws Exception{
		int res = 0;
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
			String vSQL = "{call std_sp_grabar_tipos_docs_mov(?,?,?,?)}";

			call = conn.prepareCall(vSQL);
    		call.setInt(1,Integer.parseInt(tipoDocumento.getCodTipoMovimiento()));
    		call.setInt(2,Integer.parseInt(tipoDocumento.getCodTipoDocumento()));
    		call.setString(3,tipoDocumento.getNombrePlantilla());
    		call.setBytes(4,tipoDocumento.getBytesPlantilla());
            logger.info("inicio:" + new Date());
            res = call.executeUpdate();
            logger.info("fin: " + new Date());
		}catch(Exception e){
			logger.error("[STD]: Error en actualizarTiposDocumentoMovimiento: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return res;
	}
	
	public int[] eliminarTipoDocumentoMovimiento(ArrayList lstTiposDocumentos) throws Exception{
		int res[] = new int[lstTiposDocumentos.size()];
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
			String vSQL = "{call std_sp_elim_tipo_docs_mov(?,?)}";
			int ind=0;
	    	for(Iterator it=lstTiposDocumentos.iterator(); it.hasNext();){
	    		TipoDocumento tipoDocumento = (TipoDocumento)it.next();
	    		call = conn.prepareCall(vSQL);
	    		call.setInt(1,Integer.parseInt(tipoDocumento.getCodTipoMovimiento()));
	    		call.setInt(2,Integer.parseInt(tipoDocumento.getCodTipoDocumento()));
	            logger.info("inicio:" + new Date());
	            res[ind] = call.executeUpdate();
	            logger.info("fin: " + new Date());
	    	}
		}catch(Exception e){
			logger.error("[STD]: Error en eliminarTipoDocumentoMovimiento: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return res;
	}
}
